var viewer = (function(){
    /**
     * 发布订阅模块构造函数
     */
    function Viewer() {
        this.topics = {};
    }

    /**
     * 订阅事件
     * @param  {String}    Event    事件名
     * @param  {Function}  CallBack 事件回调函数
     * 
     * @return void
     */
    Viewer.prototype.register = function (Event, CallBack) {
        utils.log("订阅事件：" + Event);

        if(!this.topics.hasOwnProperty(Event)){
            this.topics[Event] = [];
        }

        this.topics[Event].push(CallBack);
    }

    /**
     * 取消订阅事件
     * @param  {String}    Event    事件名
     * @param  {Function}  CallBack 事件函数
     * 
     * @return void
     */
    Viewer.prototype.unregister = function (Event, CallBack) {
        if(this.topics.hasOwnProperty(Event)){
            if(CallBack && typeof CallBack === "function"){
                var Events = this.topics[Event];
                
                for(var i = 0; i < this.topics[Event].length; i++){
                    if (Events[i] == CallBack){
                        Events.splice(i, 1);
                        utils.log("删除订阅事件：" + Event + "中的事件：", CallBack);

                        return;
                    }else{
                        utils.log("在订阅事件：" + Event + "中未找到回调：", CallBack);
                    }
                }
            }else{
                delete this.topics[Event];
                utils.log("删除订阅事件：" + Event);
            }
        }else{
            utils.log(new Error("不存在的订阅名：" + Event));
        }
    }

    /**
     * 发布订阅
     * @param  {String}    Event  事件名
     * @param  {...any}    args   参数列表
     * 
     * @return void
     */
    Viewer.prototype.publish = function (Event, args) {
        var args = Array.prototype.slice.call(arguments);
        var Event = args.shift();
        
        if(this.topics.hasOwnProperty(Event)){
            
            utils.log("发布事件：%c" + Event, "color:#f00");
            utils.log("参数列表：", args);
            utils.log("\n");
            
            var Event = this.topics[Event];

            for(var i in Event){
                var _cb = Event[i];

                if(typeof _cb === "function"){
                    _cb.apply(null, args);
                }else{
                    utils.log(new Error("订阅名：" + Event + "中注册了类型不正确的回调函数"));
                }
            }
        }else{
            utils.log(new Error("不存在的订阅事件：" + Event));
        }
    }

    return new Viewer();
})();